<?php
/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 textwidth=150 number: */

/**
 * Classe MunicipiosController
 *
 * ...
 *
 * PHP versão 5
 *
 * LICENÇA: Este arquivo fonte esta sob o termos da licença MIT.
 *
 * @package   scuf.controller
 * @author    Rodrigo Casara <rodrigocasara@gmail.com>
 * @copyright 2012 Rodrigo Casara
 * @license   MIT License (http://www.opensource.org/licenses/mit-license.php)
 * @version   SVN: $Id$
 * @link
 * @since     SCUF(tm) v 1.0.0
 */

App::uses('AppController', 'Controller');

/**
 * Municipios Controller
 *
 */
class MunicipiosController extends AppController {

  /**
   * Ajudantes.
   *
   * @var array
   */
  public $helpers = array('Paginator');

  /**
   * Opções de paginação.
   *
   * @var array
   */
  public $paginate = array(
    'fields' => array(
      'Municipio.id',
      'Municipio.nome',
      'Municipio.estado_id',
      'Estado.nome',
      'Estado.sigla',
      'Estado.pais_id',
      'Pais.nome',
      'Pais.sigla'
    ),
    'joins' => array(
      array(
        'table' => 'estados',
        'alias' => 'Estado',
        'type' => 'LEFT',
        'conditions' => array('Municipio.estado_id = Estado.id'),
      ),
      array(
        'table' => 'paises',
        'alias' => 'Pais',
        'type' => 'LEFT',
        'conditions' => array('Estado.pais_id = Pais.id'),
      ),
    ),
    'order' => array(
      'Pais.nome' => 'asc',
      'Estado.nome' => 'asc',
      'Municipio.nome' => 'asc'
    ),
    'limit' => 10,
    'page' => 1,
    'recursive' => -1
  );

  // Cake Callbacks {{{

  /**
   * (non-PHPdoc)
   * @see Controller::beforeFilter()
   */
  public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('obterDadosParaAutoCompletar', 'obterListaDeMunicipiosParaPesquisa');
  }

  //}}}

  /**
   * Descreva o método aqui ...
   */
  public function index() {
    $this->set('municipios', $this->paginate());
  }

  /**
   * Excluir município.
   * @param integer $id Identificador do município.
   * @throws MethodNotAllowedException
   * @throws NotFoundException
   */
  public function excluir($id) {
    if (!$this->request->is('delete')) {
      throw new MethodNotAllowedException();
    }

    $this->Municipio->id = $id;
    if (!$this->Municipio->exists()) {
      throw new NotFoundException('Município não encontrado.');
    }

    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $resposta = array(
        'mensagem' => '',
        'sucesso' => false,
      );
      $this->Municipio->begin();
      if ($this->Municipio->delete()) {
        $this->Municipio->commit();
        $resposta['mensagem'] = 'Município excluído com sucesso.';
        $resposta['sucesso'] = true;
      } else {
        $this->Municipio->rollback();
        $resposta['mensagem'] = 'Não foi possível excluir o município.';
      }
      echo json_encode($resposta);
    } else {
      throw new BadRequestException();
    }
  }

  /**
   * Descreva o método aqui ...
   * @param unknown_type $valor
   * @param unknown_type $chave
   * @return boolean
   */
  private function __formatarDados(& $valor, $chave) {
    $valor = $valor[0];
    return true;
  }

  /**
   * Descreva o método aqui ...
   * @throws MethodNotAllowedException
   * @throws BadRequestException
   */
  public function obterDadosParaAutoCompletar() {
    if (!$this->request->is('get')) {
      throw new MethodNotAllowedException();
    }

    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $termo = $this->params->query['term'];
      $dados = $this->Municipio->query(
          "SELECT M.id AS id,
                  M.nome || ', ' || E.sigla || ' - ' || P.sigla AS label
             FROM municipios M
        LEFT JOIN estados E ON (M.estado_id = E.id)
        LEFT JOIN paises P ON (E.pais_id = P.id)
            WHERE M.nome ILIKE '%{$termo}%'
         ORDER BY P.sigla ASC,
                  E.sigla ASC,
                  M.nome ASC"
      );
      array_walk($dados, array($this, '__formatarDados'));
      echo json_encode($dados);
    } else {
      throw new BadRequestException();
    }
  }

  public function obterListaDeMunicipiosParaPesquisa() {
    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $dados = $this->Municipio->query(
         "SELECT DISTINCT(M.nome)
            FROM municipios M
        ORDER BY M.nome ASC"
      );
      //
      array_walk($dados, array($this, '__formatarDados'));
      $d = reset($dados);
      while ($d !== false) {
        $chave = key($dados);
        $dados[$chave] = $d['nome'];
        $d = next($dados);
      }
      //
      echo json_encode($dados);
    }
  }

}
?>